package cn.anecansaitin.firecrafting.api.common.block.entity;

import cn.anecansaitin.firecrafting.api.common.IResultType;
import cn.anecansaitin.firecrafting.common.block.entity.FireInterfaceEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandler;
import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * 火焰交互方块实体接口，实现接口来添加自定义的方块实体。<br/>
 * 被实现的类必须继承{@link BlockEntity}。
 *
 * @see FireInterfaceEntity
 */
public interface IFireInterfaceEntity {

    /**
     * 实体每tick执行的任务，所有关于配方检测与实施的逻辑均在此方法内实现。
     */
    void tick(Level world, BlockPos pos, BlockState state);

    /**
     * 被IFireRecipe调用，用于检测实体是否能处理配方的产物。<br/>
     * 建议被调用的IType为单例，在配方和实体内使用同一个对象。<br/>
     * 当然不是单例也不会造成问题。
     *
     * @return 该实体能处理的配方产物类型
     */
    List<IResultType> actionType();

    /**
     * @return 实体保存的所有原料（物品）
     */
    List<ItemStack> getMaterial();

    /**
     * @return 实体所在坐标下方的方块
     */
    Block getFire();

    /**
     * 获取实体拥有的产物能力，所有关于产物的能力都应该能通过该方法获取。
     */
    @NotNull <T> LazyOptional<T> getCapForOutput(@NotNull Capability<T> cap);

    /**
     * 获取原料存入的物品能力。
     */
    @NotNull
    LazyOptional<IItemHandler> getCapForInput();
}
